package com.ticket.sass.common.ticketserver

import com.google.gson.Gson
import com.google.gson.JsonSyntaxException
import com.google.gson.reflect.TypeToken
import com.ticket.sass.common.ticketserver.configure.Config
import com.ticket.sass.common.ticketserver.dto.input.*
import com.ticket.sass.common.ticketserver.dto.output.*
import com.ticket.sass.common.ticketserver.exceptions.ParseDataException
import mu.KotlinLogging
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type


/**
 * @author 朱其鹏
 * @date 2023/12/11 21:59
 */
abstract class ApiInterface {
    protected val logger = KotlinLogging.logger { }

    /**
     * 配置数据
     */
    lateinit var config: Config

    /**
     * json 转 model
     *
     * @param model 数据模型
     *
     * @return [T]
     */
    fun <T>String.parseJson(model: Class<T>): T {
        return try {
            Gson().fromJson(this, model)
        } catch (e: JsonSyntaxException) {
            e.printStackTrace()
            logger.error { "JSON 数据解析异常：${e.message}" }

            throw ParseDataException("1", e.message)
        }
    }

    /**
     * json 转 model
     *
     * @param typeToken 数据模型
     *
     * @return [T]
     */
    fun <T>String.parseJson(typeToken: TypeToken<T>): T {
        return try {
            Gson().fromJson(this, typeToken.type)
        } catch (e: JsonSyntaxException) {
            e.printStackTrace()
            logger.error { "JSON 数据解析异常：${e.message}" }

            throw ParseDataException("1", e.message)
        }
    }

    /**
     * 获取排期
     */
    abstract fun schedules(input: ScheduleInput): ScheduleOutput

    /**
     * 获取排期座位图
     */
    abstract fun scheduleSeatMap(input: ScheduleSeatMapInput): ScheduleSeatMapOutput

    /**
     * 获取影厅列表
     */
    abstract fun halls(): HallOutput

    /**
     * 锁座
     */
    abstract fun seatLock(input: SeatLockInput): SeatLockOutput

    /**
     * 座位解锁
     */
    abstract fun seatUnlock(input: SeatUnlockInput): SeatUnlockOutput

    /**
     * 影票订单提交
     */
    abstract fun orderTicketSubmit(input: OrderTicketSubmitInput): OrderTicketSubmitOutput

    /**
     * 影票订单状态查询
     */
    abstract fun orderTicketStatus(input: OrderTicketStatusInput): OrderTicketStatusOutput

    /**
     * 影票订单信息查询
     */
    abstract fun orderTicketInfo(input: OrderTicketInfoInput): OrderTicketInfoOutput

    /**
     * 影票订单退单
     */
    abstract fun orderTicketRefund(input: OrderTicketRefundInput): OrderTicketRefundOutput
}
